import type { UseFetchOptions } from 'nuxt/app'

export function useCustomFetch<T>(url: string | (() => string), options: UseFetchOptions<T> = {}) {
  // nuxt UI 提示框
  const toast = useToast()
  // 获取cookie
  const userStore = useUserStore()
  // 获取路由信息
  const route = useRoute()
  const router = useRouter()
  // 获取环境变量
  const config = useRuntimeConfig()
  const $customFetch = $fetch.create({
    // 使用环境变量配置基础URL
    baseURL: config.public.baseURL as string,
    // 添加自定义请求头
    headers: {
      Authorization: userStore.token ? `Bearer ${userStore.token}` : ''
    },
    // 处理请求结果
    parseResponse: (responseText: string) => {
      const res = JSON.parse(responseText)
      if (res.code === 200) {
        return res.data
      }
      return JSON.parse(responseText)
    },
    // 自定义请求错误处理
    onRequestError() {
      toast.add({
        title: '请求出错，请重试！',
        color: 'red',
        icon: 'i-heroicons-x-circle-20-solid'
      })
    },

    // 自定义响应错误处理
    onResponseError(context) {
      const { response } = context
      switch (response.status) {
        case 400:
          toast.add({
            title: response._data.message ?? '参数错误',
            color: 'red',
            icon: 'i-heroicons-x-circle-20-solid'
          })
          break
        case 401:
          toast.add({
            title: response._data.message || '没有访问权限',
            color: 'red',
            icon: 'i-heroicons-x-circle-20-solid'
          })
          // 清空登录信息
          userStore.logout()
          router.push(`/signin?redirect=${route.path}`)
          break
        case 403:
          toast.add({
            title: '服务器拒绝访问',
            color: 'red',
            icon: 'i-heroicons-x-circle-20-solid'
          })
          break
        case 404:
          toast.add({ title: '请求地址错误', color: 'red', icon: 'i-heroicons-x-circle-20-solid' })
          break
        case 500:
          toast.add({ title: '服务器异常', color: 'red', icon: 'i-heroicons-x-circle-20-solid' })
          break
        default:
          toast.add({ title: '网络连接故障', color: 'red', icon: 'i-heroicons-x-circle-20-solid' })
          break
      }
    }
  })
  return useFetch(url, {
    ...options,
    $fetch: $customFetch
  })
}
